home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 2000 October / Software of the Month - Ultimate Collection Shareware 277.iso / pc / PROGRAMS / UTILITY / WINLINUX / DATA1.CAB / programs_-_include / ASM-ARM / ARCH-ARC / IRQ.H < prev    next >
C/C++ Source or Header  |  1999-09-17  |  3KB  |  146 lines

  1. /*
  2.  * include/asm-arm/arch-arc/irq.h
  3.  *
  4.  * Copyright (C) 1996 Russell King
  5.  *
  6.  * Changelog:
  7.  *   24-09-1996    RMK    Created
  8.  *   10-10-1996    RMK    Brought up to date with arch-sa110eval
  9.  *   22-10-1996    RMK    Changed interrupt numbers & uses new inb/outb macros
  10.  *   11-01-1998    RMK    Added mask_and_ack_irq
  11.  *   22-08-1998    RMK    Restructured IRQ routines
  12.  */
  13.  
  14. static void arc_mask_irq_ack_a(unsigned int irq)
  15. {
  16.     unsigned int temp;
  17.  
  18.     __asm__ __volatile__(
  19.     "ldrb    %0, [%2]\n"
  20. "    bic    %0, %0, %1\n"
  21. "    strb    %0, [%2]\n"
  22. "    strb    %1, [%3]"
  23.     : "=&r" (temp)
  24.     : "r" (1 << (irq & 7)), "r" (ioaddr(IOC_IRQMASKA)),
  25.       "r" (ioaddr(IOC_IRQCLRA)));
  26. }
  27.  
  28. static void arc_mask_irq_a(unsigned int irq)
  29. {
  30.     unsigned int temp;
  31.  
  32.     __asm__ __volatile__(
  33.     "ldrb    %0, [%2]\n"
  34. "    bic    %0, %0, %1\n"
  35. "    strb    %0, [%2]"
  36.     : "=&r" (temp)
  37.     : "r" (1 << (irq & 7)), "r" (ioaddr(IOC_IRQMASKA)));
  38. }
  39.  
  40. static void arc_unmask_irq_a(unsigned int irq)
  41. {
  42.     unsigned int temp;
  43.  
  44.     __asm__ __volatile__(
  45.     "ldrb    %0, [%2]\n"
  46. "    orr    %0, %0, %1\n"
  47. "    strb    %0, [%2]"
  48.     : "=&r" (temp)
  49.     : "r" (1 << (irq & 7)), "r" (ioaddr(IOC_IRQMASKA)));
  50. }
  51.  
  52. static void arc_mask_irq_b(unsigned int irq)
  53. {
  54.     unsigned int temp;
  55.  
  56.     __asm__ __volatile__(
  57.     "ldrb    %0, [%2]\n"
  58. "    bic    %0, %0, %1\n"
  59. "    strb    %0, [%2]"
  60.     : "=&r" (temp)
  61.     : "r" (1 << (irq & 7)), "r" (ioaddr(IOC_IRQMASKB)));
  62. }
  63.  
  64. static void arc_unmask_irq_b(unsigned int irq)
  65. {
  66.     unsigned int temp;
  67.  
  68.     __asm__ __volatile__(
  69.     "ldrb    %0, [%2]\n"
  70. "    orr    %0, %0, %1\n"
  71. "    strb    %0, [%2]"
  72.     : "=&r" (temp)
  73.     : "r" (1 << (irq & 7)), "r" (ioaddr(IOC_IRQMASKB)));
  74. }
  75.  
  76. static void arc_mask_irq_fiq(unsigned int irq)
  77. {
  78.     unsigned int temp;
  79.  
  80.     __asm__ __volatile__(
  81.     "ldrb    %0, [%2]\n"
  82. "    bic    %0, %0, %1\n"
  83. "    strb    %0, [%2]"
  84.     : "=&r" (temp)
  85.     : "r" (1 << (irq & 7)), "r" (ioaddr(IOC_FIQMASK)));
  86. }
  87.  
  88. static void arc_unmask_irq_fiq(unsigned int irq)
  89. {
  90.     unsigned int temp;
  91.  
  92.     __asm__ __volatile__(
  93.     "ldrb    %0, [%2]\n"
  94. "    orr    %0, %0, %1\n"
  95. "    strb    %0, [%2]"
  96.     : "=&r" (temp)
  97.     : "r" (1 << (irq & 7)), "r" (ioaddr(IOC_FIQMASK)));
  98. }
  99.  
  100. static __inline__ void irq_init_irq(void)
  101. {
  102.     extern void ecard_disableirq(unsigned int irq);
  103.     extern void ecard_enableirq(unsigned int irq);
  104.     int irq;
  105.  
  106.     outb(0, IOC_IRQMASKA);
  107.     outb(0, IOC_IRQMASKB);
  108.     outb(0, IOC_FIQMASK);
  109.  
  110.     for (irq = 0; irq < NR_IRQS; irq++) {
  111.         switch (irq & 0xf8) {
  112.         case 0 ... 6:
  113.             irq_desc[irq].probe_ok = 1;
  114.         case 7:
  115.             irq_desc[irq].valid    = 1;
  116.             irq_desc[irq].mask_ack = arc_mask_irq_ack_a;
  117.             irq_desc[irq].mask     = arc_mask_irq_a;
  118.             irq_desc[irq].unmask   = arc_unmask_irq_a;
  119.             break;
  120.  
  121.         case 9 ... 15:
  122.             irq_desc[irq].probe_ok = 1;
  123.         case 8:
  124.             irq_desc[irq].valid    = 1;
  125.             irq_desc[irq].mask_ack = arc_mask_irq_b;
  126.             irq_desc[irq].mask     = arc_mask_irq_b;
  127.             irq_desc[irq].unmask   = arc_unmask_irq_b;
  128.             break;
  129.  
  130.         case 32 ... 40:
  131.             irq_desc[irq].valid    = 1;
  132.             irq_desc[irq].mask_ack = ecard_disableirq;
  133.             irq_desc[irq].mask     = ecard_disableirq;
  134.             irq_desc[irq].unmask   = ecard_enableirq;
  135.             break;
  136.  
  137.         case 64 ... 72:
  138.             irq_desc[irq].valid    = 1;
  139.             irq_desc[irq].mask_ack = arc_mask_irq_fiq;
  140.             irq_desc[irq].mask     = arc_mask_irq_fiq;
  141.             irq_desc[irq].unmask   = arc_unmask_irq_fiq;
  142.             break;
  143.         }
  144.     }
  145. }
  146.